#include "app_common.h"
#include "sys/time.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

long app_common_getCurTime(void)
{
   
   
   struct timeval time;
   gettimeofday(&time, NULL);
   return time.tv_sec * 1000 + time.tv_usec / 1000; /* s->ms,us->ms*/
}

/**
 * @function 将传进来的hexStr转换为普通的Str
 * @return 返回转换后的Str
 * @attention 本项目设计到的所有字符串处理，结尾默认都�?'\0',也就是说一个函数接受到的字符串都有'\0'结尾
 */
char *app_common_hex2str(char *HexStr)
{
   /* 1. 动态申请堆空间 */
   char *Str = (char *)malloc(strlen(HexStr) / 2 + 1); /* 2个字节表�?1个字�?,还有1个‘\0’占位符 */
   if (Str == NULL)
   {
      return NULL;
   }

   /* 2. hexStr -> str */
   for (__uint8_t i = 0; i < strlen(HexStr) - 1; i += 2)
   {
      sscanf(HexStr + i, "%02hhx", &Str[i / 2]);
   }

   /* note: malloc string do not add '\0'*/
   // Str[sizeof(Str) - 1] = '\0'; // the last element index == sizeof(Str) - 1
   Str[strlen(HexStr) / 2] = '\0'; // 这个是对�?

   return Str;
}

/**
 * @function 将传进来的Str转换为hexStr
 * @return 返回转换后的hexStr
 * @attention 本项目设计到的所有字符串处理，结尾默认都�?'\0',也就是说一个函数接受到的字符串都有'\0'结尾
 */
char *app_common_str2hex(char *Str)
{
   /* 1. 动态申请堆空间 */
   char *hexStr = (char *)malloc(strlen(Str) * 2 + 1); /* 1个字�?->2个字节表�?,还有1个‘\0’占位符 */
   if (hexStr == NULL)
   {
      return NULL;
   }

   /* 2. str -> hexStr */
   for (__uint8_t i = 0; i < strlen(Str); i++)
   {
      // sprintf(hexStr[i * 2], "%02x", Str[i]);
      sprintf(hexStr + i * 2, "%02x", Str[i]); /* 1->2 : 'a'->'4''1'*/
   }

   /* note: malloc string do not add '\0'*/
   // hexStr[sizeof(hexStr) - 1] = '\0'; // 注意这个是错的，sizeof(hexStr)得到的是指针所占空间大�? the last element index == sizeof(hexStr) - 1
   hexStr[strlen(Str) * 2] = '\0'; // 这个是对�?

   return hexStr;
}